#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
主题:保留最后 N 个元素
问题: 在迭代操作或者其他操作的时候，怎样只保留最后有限几个元素的历史记录？
提示 : 
    1. deque有一个maxlen参数，当append的时候，如果超过，那么最前面的就被挤出队列。
    2. 在队列两端插入或删除元素时间复杂度都是 O(1) ，区别于列表，在列表的开头插入或删除元素的时间复杂度为 O(N)
"""

from collections import deque


def main():
    print('recipe1'.center(20,'*'))
    recipe1()
    print('recipe2'.center(20,'*'))
    recipe2()
    print('recipe3'.center(20,'*'))
    recipe3()


def recipe1():
    '''在多行上面做简单的文本匹配， 并返回匹配所在行的最后N行'''
    # Example use on a file
    with open(r'../somefile.txt') as f:
        for line, prevlines in search(f, 'Python', 5):
            for pline in prevlines:
                print(pline, end='')
            print(line, end='')
            print('-' * 20)


def recipe2():
    '''当新的元素加入并且这个队列已满的时候， 最老的元素会自动被移除掉'''
    q = deque(maxlen=3)
    q.append(1)
    q.append(2)
    q.append(3)
    print(f"{q = }")
    q.append(4)
    print(f"{q = }")


def recipe3():
    '''如果不设置最大队列大小，那么就会得到一个无限大小队列，你可以在队列的两端执行添加和弹出元素的操作'''
    q = deque()
    q.append(1)
    q.append(2)
    q.append(3)
    print(f"{q = }")

    q.appendleft(4)
    print(f"{q = }")

    q.pop()
    print(f"{q = }")
    q.popleft()
    print(f"{q = }")


def search(lines, pattern, history=5):
    previous_lines = deque(maxlen=history)
    for line in lines:
        if pattern in line:
            yield line, previous_lines
        previous_lines.append(line)


if __name__ == '__main__':
    main()
